<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 函数也是一个实例化对象
    function Cat(name, color) {
        // 实例
        this.name = name;
        this.color = color;
    }

    // 可以定义自己的属性和方法  => 静态方法(构造函数自己使用 Array.isArray Array.from  Object.formCharCode  Promise.all)
    // Cat.hello = '你好';
    // Cat.isCat = function (arg) {
    //     if (arg.constructor === Cat) {
    //         return true;
    //     }
    //     return false;
    // }


    // prototype => 给实例化对象用的    => 动态方法
    Cat.prototype.species = "猫";
    Cat.prototype.say = function () {
        console.log(this.name, this.color);
    }
    Cat.prototype.sayHello = function () {
        console.log("hello");
    }

    Object.prototype.hello = "hello";

    var Tom = new Cat("Tom", "black");
    console.log(Tom);

    // Tom的原型链
    // Tom(实例本身) => Tom.__proto__ (Cat.prototype) => Cat.prototype.__proto__ (Object.prototype)  =>   null

    // instanceof 判断Tom的原型链上是否存在 某个构造函数 的原型对象
    // console.log(Tom instanceof Cat);
    // console.log(Tom instanceof Object);

    // isPrototypeOf   判断 某个构造函数的原型对象 是否 存在于  某个实例的原型链上
    // console.log(Cat.prototype.isPrototypeOf(Tom));
    // console.log(Object.prototype.isPrototypeOf(Tom));

    // hasOwnProperty 判断某个实例化对象上是否存在 某个属性  (只找实例本身  不找原型链)
    // console.log(Tom.hasOwnProperty("name"));  //true
    // console.log(Tom.hasOwnProperty("color"));
    // console.log(Tom.hasOwnProperty("species")); // false

    // in     判断某个实例化对象的原型链上 是否存在 某个属性  (既找实例本身  也找原型链)  
    // console.log("name" in Tom);
    // console.log("color" in Tom);
    // console.log("species" in Tom);
    // console.log("hello" in Tom);

    // propertyIsEnumerable  方法返回一个布尔值，表示指定的属性是否可枚举(遍历)。  (只找实例本身  不找原型链)

    console.log(Tom.propertyIsEnumerable("name"));;
    console.log(Tom.propertyIsEnumerable("color"));;
    console.log(Tom.propertyIsEnumerable("species"));;

    // (找原型链  for...in)
    // for (var key in Tom) {
    //     console.log(key);
    // }











</script>

</html>